package com.xinggq.auth.api.enums;

/**
 * 会话管理策略枚举
 * 定义当用户重复登录时的处理策略
 *
 * @author xinggq
 * @since 2025-10-30
 */
public enum SessionManagementStrategy {

    /**
     * 允许多端登录
     * 同一用户可以在多个设备/浏览器同时登录
     */
    ALLOW_MULTIPLE("ALLOW_MULTIPLE", "允许多端登录"),

    /**
     * 单点登录 - 踢出旧会话
     * 新登录会使旧的会话失效
     */
    SINGLE_SESSION_KICK_OLD("SINGLE_SESSION_KICK_OLD", "单点登录-踢出旧会话"),

    /**
     * 单点登录 - 拒绝新登录
     * 如果已有活跃会话，拒绝新的登录请求
     */
    SINGLE_SESSION_REJECT_NEW("SINGLE_SESSION_REJECT_NEW", "单点登录-拒绝新登录"),

    /**
     * 限制并发会话数
     * 允许有限数量的并发会话，超出时踢出最旧的会话
     */
    LIMITED_CONCURRENT("LIMITED_CONCURRENT", "限制并发会话数");

    private final String code;
    private final String description;

    SessionManagementStrategy(String code, String description) {
        this.code = code;
        this.description = description;
    }

    public String getCode() {
        return code;
    }

    public String getDescription() {
        return description;
    }

    /**
     * 根据代码获取策略
     *
     * @param code 策略代码
     * @return 会话管理策略
     */
    public static SessionManagementStrategy fromCode(String code) {
        for (SessionManagementStrategy strategy : values()) {
            if (strategy.getCode().equals(code)) {
                return strategy;
            }
        }
        throw new IllegalArgumentException("未知的会话管理策略: " + code);
    }
}